library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_signed.all;

entity MEM is
port(
	Registrador_ER_do_EXMEM: in std_logic_vector(1 downto 0);
	
	--******IMPORTANTE*****
	--Tratar do problema do Registrador ER para Unidade de Adiantamento
	
	
	
	
	--Registrador_M_do_EXMEM_para_DvC: in std_logic;
	--Registrador_do_ZERO: in std_logic;
	--Resultado_da_ULA_para_ER: out std_logic_vector(31 downto 0);
	
	--Registrador_ER_Para_Unidade_De_Adiantamento: in  	
	Registrador_M_do_EXMEM_para_LerMem: in std_logic;
	Registrador_M_do_EXMEM_para_EscMem: in std_logic;		
	Resultado_da_ULA: in std_logic_vector(31 downto 0);
	dado_lido_RT_banco_registradores: in std_logic_vector(31 downto 0);
	Saida_Resultado_da_ULA_para_os_MuX_da_ULA_do_EX: out std_logic_vector(31 downto 0);
	
	Registrador_do_MUX_do_reg_destino: in std_logic_vector(4 downto 0);	
	
	
	
	clock: in std_logic;	
	Registrador_ER_do_MEM_ER: out std_logic_vector(1 downto 0);
	dado_lido_memoria: out std_logic_vector(31 downto 0);		
	Registrador_do_MUX_do_reg_destino_para_ER: out std_logic_vector(4 downto 0);
	Registrador_do_MUX_do_Reg_Destino_para_Unidade_Adiantamento: out std_logic_vector(4 downto 0);
	Saida_DvC: out std_logic);
end MEM;

architecture behavior of MEM is
	component MemoriaDeDados is
		PORT
		(
			clock		: IN STD_LOGIC  := '1';
			data		: IN STD_LOGIC_VECTOR (31 DOWNTO 0);
			rdaddress		: IN STD_LOGIC_VECTOR (11 DOWNTO 0);
			wraddress		: IN STD_LOGIC_VECTOR (11 DOWNTO 0);
			wren		: IN STD_LOGIC  := '0';
			q		: OUT STD_LOGIC_VECTOR (31 DOWNTO 0)
		);
		end component;	
	signal dado_lido_memoria_temporario: std_logic_vector(31 downto 0); 
	begin
		Registrador_do_MUX_do_Reg_Destino_para_Unidade_Adiantamento <= Registrador_do_MUX_do_reg_destino; 
		Saida_Resultado_da_ULA_para_os_MuX_da_ULA_do_EX <= Resultado_da_ULA;
		process(clock)
		begin
			if (rising_edge(clock)) then
				Registrador_ER_do_MEM_ER <= Registrador_ER_do_EXMEM;
				
				--Saida_DvC <= Registrador_M_do_EXMEM_para_DvC and Registrador_do_Zero;
				
				Registrador_do_MUX_do_reg_destino_para_ER <= Registrador_do_MUX_do_reg_destino;
				dado_lido_memoria <= dado_lido_memoria_temporario;
			end if;
		end process;		
				
		mexer_na_memoria: MemoriaDeDados
		port map
		(
			clock => clock, 
			data => dado_lido_RT_banco_registradores, 
			rdaddress => Resultado_da_ULA(11 downto 0),
			wraddress => Resultado_da_ULA(11 downto 0),
			wren => Registrador_M_do_EXMEM_para_LerMem,
			q => dado_lido_memoria_temporario);

end behavior;
		
		
		
		
		
		
	
	